package sculove.spring.zzz.comCd.service;

import java.util.HashMap;
import java.util.Iterator;
import java.util.List;

import sculove.spring.framework.util.Configuration;
import sculove.spring.framework.util.SStringUtil;
import sculove.spring.zzz.comCd.model.ComCdDTO;

public class ComCdManager {

    // 내부 공통코드 인스턴스 
	private static ComCdManager instance = null;

    // 내부 공통코드 HashMap
    private static HashMap<String, List<ComCdDTO>> globalComCd = null;

    // private 생성
    private ComCdManager() {
        globalComCd = new HashMap<String, List<ComCdDTO>>();
    }

    // Instance 생성
    private static synchronized void newInstance(){
        if(instance == null){
            instance = new ComCdManager();
        }
    }

    // Instance refresh
    public static synchronized void refresh(){
        instance = null;
        newInstance();
    }
    
    // 부모, 자식 노드 판별
    public static boolean isChildKey(String key){
        if(key.indexOf(Configuration.getPropInstance().getString("zzz.comCd.separator")) == -1){ // 공통코드
            return false;
        }else{ // 자식코드
            return true;
        }
    }
    
    // Key에 해당하는 DTO 도출
    public static ComCdDTO getComCdDTO(String key) throws Exception{
        if(!SStringUtil.hasText(key)){
            throw new Exception("에러");
        }
        if(isChildKey(key)) {
            String[] arry = key.split(Configuration.getPropInstance().getString("zzz.comCd.separator"));
            if(arry.length == 2) {
                return new ComCdDTO(arry[0], arry[1]);
            } else {
                return null;
            }
        } else {
            return new ComCdDTO(key);
        }
    }
    

    public static void put(String key, List<ComCdDTO> list){
        newInstance();
        if(!globalComCd.containsKey(key)){
            synchronized(globalComCd){
                globalComCd.put(key, list);
            }
        }
    }

    public static List<ComCdDTO> get(String key){
        newInstance();
        List<ComCdDTO> list = null;
        if(globalComCd.containsKey(key)){
            list = globalComCd.get(key);
        }
        return list;
    }

    //	/**
    //	 * Key들의 iterator를 얻는다.
    //	 * @return
    //	 */
    //	static public Iterator getKeys()
    //	{
    //		newInstance();
    //		return globalComCd.keySet().iterator();
    //	}

    // ComCdUtil 전체 출력
    public static void printKeys(){
        newInstance();
        StringBuffer sb = new StringBuffer();

        Iterator iter = globalComCd.keySet().iterator();
        while(iter.hasNext()){
            String key = (String)iter.next();
            sb.append("[[" + key + "]] --------------------------------\n ");
            List<ComCdDTO> list = globalComCd.get(key);
            for(int i = 0; i < list.size(); i++){
                sb.append("==> ").append(list.get(i).getCd()).append(" : ").append(list.get(i).getCdNm()).append("\n");
            }
            System.out.println(sb.toString());
        }
    }
}
